home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
PsL Monthly 1993 December
/
PSL Monthly Shareware CD-ROM (December 1993).iso
/
prgmming
/
dos
/
basic
/
synth.bas
< prev
next >
Wrap
BASIC Source File
|
1990-08-02
|
5KB
|
181 lines
ega = 1
SCREEN 9
IF ega THEN
COL = 12
COLOR COL
FOR t = 1 TO 8
kwd = 32
LINE (141 + t * kwd, 10)-(139 + t * kwd + kwd, 80), 15, BF
READ a$, B$
LOCATE 7, 20 + t * 4: PRINT a$
LOCATE 5, 20 + t * 4: PRINT B$
NEXT
offset = 5
FOR t = 1 TO 6
IF t <> 3 THEN
LINE (140 + (kwd / 2) + t * kwd + offset, 10)-(140 + (kwd / 2) + t * kwd + kwd - offset, 50), 0, BF
READ a$: LOCATE 3, 22 + t * 4: PRINT a$
END IF
NEXT
END IF
DATA C,Z,D,X,E,C,F,V,G,B,A,N,B,M,C,",",S,D,F,H,J
LOCATE 20, 25: PRINT CHR$(27); CHR$(26); " to select active modules."
PRINT SPACE$(18); CHR$(24); CHR$(25); " to change value - SHIFT for coarse tuning."
PRINT SPACE$(20); "SPACE BAR toggles sound : Q to quit"
CHOICE$(0) = " RANDOM "
CHOICE$(1) = "TRIANGLE"
CHOICE$(2) = "SAWTOOTH"
CHOICE$(3) = " SQUARE "
CHOICE$(4) = " RAMP "
CHOICE = 1
X = 8: Y = 13
SEL = 1
SND = 1
COLOR 3
LOCATE 10, 6: PRINT "FREQUENCY"
LOCATE 10, 31: PRINT "MODULATION"
LOCATE 9, 55: PRINT "MODULATION"
LOCATE 10, 56: PRINT "FREQUENCY"
MODL = 0
BASEFREQ = 500
bfq = 500
DURATION = 7
FOR SEL = 1 TO 4: GOSUB SKP: NEXT: SEL = 1: GOSUB SKP
AG:
GOSUB LP
GOTO AG
LP:
IN$ = INKEY$
IF INSTR("ZSXDCVGBHNJM,", IN$) <> 0 AND INL$ = IN$ THEN GOSUB FM: GOTO LP
IF IN$ = "" THEN
IF SND THEN GOSUB FM
GOTO LP
END IF
IF IN$ = " " THEN SND = 1 - SND
IF INSTR("Qq", IN$) <> 0 THEN END
IF INSTR("Zz", IN$) <> 0 THEN NOTE = 0
IF INSTR("Ss", IN$) <> 0 THEN NOTE = 1
IF INSTR("Xx", IN$) <> 0 THEN NOTE = 2
IF INSTR("dD", IN$) <> 0 THEN NOTE = 3
IF INSTR("Cc", IN$) <> 0 THEN NOTE = 4
IF INSTR("Vv", IN$) <> 0 THEN NOTE = 5
IF INSTR("gG", IN$) <> 0 THEN NOTE = 6
IF INSTR("bB", IN$) <> 0 THEN NOTE = 7
IF INSTR("hH", IN$) <> 0 THEN NOTE = 8
IF INSTR("nN", IN$) <> 0 THEN NOTE = 9
IF INSTR("jJ", IN$) <> 0 THEN NOTE = 10
IF INSTR("mM", IN$) <> 0 THEN NOTE = 11
IF IN$ = "," THEN NOTE = 12
INL$ = IN$
bfq = INT(BASEFREQ * ((2 ^ (1 / 12)) ^ NOTE))
LOCATE 12, 7: PRINT bfq; " "
IN = ASC(RIGHT$(IN$, 1))
IF IN = 77 AND LEN(IN$) > 1 THEN SEL = SEL + 1
IF IN = 75 AND LEN(IN$) > 1 THEN SEL = SEL - 1
IF SEL < 1 THEN SEL = 4
IF SEL > 4 THEN SEL = 1
'LOCATE 9,1:PRINT SPACE$(79);
SKP:
IF SEL = 1 THEN C = 11 ELSE C = 1
LINE (5 * X, 11 * Y + 5)-(15 * X, 13 * Y + 5), C, B
IF SEL = 2 THEN C = 11 ELSE C = 1
LINE (30 * X, 11 * Y + 5)-(40 * X, 13 * Y + 5), C, B
IF SEL = 3 THEN C = 11 ELSE C = 1
LINE (55 * X, 11 * Y + 5)-(65 * X, 13 * Y + 5), C, B
IF SEL = 4 THEN C = 11 ELSE C = 1
LINE (30 * X, 15 * Y + 5)-(40 * X, 17 * Y + 5), C, B
IF SEL = 1 THEN
LEAP = 1
IF IN = 56 THEN LEAP = BASEFREQ
IF IN = 50 THEN LEAP = BASEFREQ / 2
IF IN = 72 OR IN = 56 THEN BASEFREQ = BASEFREQ + LEAP
IF IN = 80 OR IN = 50 THEN BASEFREQ = BASEFREQ - LEAP
IF BASEFREQ < 100 THEN BASEFREQ = 100
IF BASEFREQ > 10000 THEN BASEFREQ = 10000
bfq = INT(BASEFREQ * ((2 ^ (1 / 12)) ^ NOTE))
LOCATE 12, 7: PRINT bfq
END IF
IF SEL = 2 THEN
LEAP = 1
IF IN = 56 OR IN = 50 THEN LEAP = 25
IF IN = 72 OR IN = 56 THEN MODL = MODL + LEAP
IF IN = 80 OR IN = 50 THEN MODL = MODL - LEAP
IF MODL < 0 THEN MODL = 0
LOCATE 12, 33: PRINT MODL
END IF
IF SEL = 3 THEN
LEAP = 1
IF IN = 56 OR IN = 50 THEN LEAP = 25
IF IN = 72 OR IN = 56 THEN DURATION = DURATION + LEAP
IF IN = 80 OR IN = 50 THEN DURATION = DURATION - LEAP
IF DURATION < 1 THEN DURATION = 1
LOCATE 12, 57: PRINT DURATION
END IF
IF SEL = 4 THEN
IF IN = 72 THEN CHOICE = CHOICE + 1
IF IN = 80 THEN CHOICE = CHOICE - 1
IF CHOICE < 0 THEN CHOICE = 4
IF CHOICE > 4 THEN CHOICE = 0
LOCATE 16, 32: PRINT CHOICE$(CHOICE)
END IF
RETURN
END
FM:
'MODL --- MODULATION FACTOR
'BASEFREQ --- BASE FREQUENCY
IF CHOICE = 0 THEN mod1 = RND * MODL
'TRIANGLE
MODLP = MODL / DURATION
IF CHOICE = 1 THEN
MFT = MFT + MODLP
IF MFT > MODL THEN MFT = 0
mod1 = ABS((MODL / 2) - MFT) * 2
END IF
'SAWTOOTH
IF CHOICE = 2 THEN
MFT = MFT + MODLP
IF MFT > MODL THEN MFT = 0
mod1 = MFT
END IF
'SQUARE
IF CHOICE = 3 THEN
MFT = MFT + MODLP
IF MFT > MODL THEN MFT = 0
mod1 = 0
IF MFT > MODL / 2 THEN mod1 = MODL
END IF
IF CHOICE = 4 THEN
MFT = MFT + MODLP
IF MFT > MODL THEN MFT = 0
INC = 1: IF MFT > MODL / 2 THEN INC = -1
mod1 = MODL / 2 + MFT * INC
END IF
SOUND mod1 + bfq, .1
RETURN
' IF INVAL=77 THEN 'Right Arrow
' IF INVAL=75 THEN 'Left Arrow
' IF INVAL=72 THEN 'Up Arrow
' IF INVAL=80 THEN 'Down Arrow